// 引入axios的核心库以及一些规则定义方法
import axios, { AxiosInstance, AxiosResponse, AxiosRequestConfig } from 'axios'
//引入自定义的数据接口
import { ResultData } from './interface'
// 引入route
import router from '../router'
//封装配置方法
let config = {
  //基础地址
  baseURL: '/api'
}

//封装一个请求类 这个类中包含了拦截器，包含了 get/post方法
class HttpRequest {
  //创建一个http的属性 代表的就是axios
  http: AxiosInstance
  constructor (config: AxiosRequestConfig) {
    //重新实例化了一个axios
    this.http = axios.create(config)
    //请求拦截器
    this.http.interceptors.request.use((req: any) => {
      //进行token的验证
      if (req.url != '/userlogin') {
        // 添加登录token信息
        req.headers.authorization =
          JSON.parse(sessionStorage.getItem('userInfo') + '').token || null
      }
      return req
    })
    //响应拦截器
    this.http.interceptors.response.use((res: any) => {
      // 全局拦截token错误信息
      if (
        res.data.msg == '请设置请求头,并携带验证字符串' ||
        res.data.msg == '登录已过期或访问权限受限'
      ) {
        alert(res.data.msg)
        // 跳转到登录
        router.push('/login')
        return
      }
      return res
    })
  }
  /* 
        封装get方法
        url
        params
    */
  get<T> (url: string, params?: object): Promise<ResultData<T>> {
    return this.http.get(url, { params })
  }
  /* 
    封装post 方法
   */
  post<T> (url: string, params?: object): Promise<ResultData<T>> {
    return this.http.post(url, params)
  }
}

//导出封装好的类
export default new HttpRequest(config)
